package putYourHands.app;

import java.math.BigInteger;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

/**
 * Esta clase representa al <b>Paciente</b> con todos sus datos.
 * 
 * @author Pedro
 * 
 */

@Entity
@Table(name="PACIENTE")
public class Paciente extends ObjetoPersistente{

	@Column(name="nombre", nullable=false)
	private String nombre;

	@Column(name="apellido", nullable=false)
	private String apellido;

	@Column(unique=true,nullable=false, name="dni")
	private BigInteger dni;

	@Column(name="fecha_nac", nullable=false)
	private GregorianCalendar fechaNacimiento;

	// Propiedad calculada
	@Transient
	private int edad;

	@ManyToOne(cascade=CascadeType.ALL)
	private ObraSocial obraSocial;

	@Column(name="nro_carnet")
	private String nroCarnet;

	@Column(name="venc_carnet")
	private GregorianCalendar vencimientoCarnet;

	// Indica si el Paciente tiene coseguro o no
	@Column(name="tiene_coseguro")
	private Boolean tieneCoseguro;

	// FIXME Validar los caracteres que puede contener
	@Column(name="telefono")
	private String telefono;

	// Domicilio del Paciente
	@Column(name="domicilio")
	private String domicilio;
	
//	private List<Atencion> atenciones;

	
	public Paciente(){
		
	}
	/**
	 * 
	 * @param nombre
	 * @param apellido
	 * @param dni
	 * @param fechaNac
	 * @param telefono
	 * @param domicilio
	 */
	public Paciente(String nombre, String apellido, BigInteger dni,
			GregorianCalendar fechaNac, String telefono, String domicilio) {
		this.nombre = nombre;
		this.apellido = apellido;
		this.dni = dni;
		this.fechaNacimiento = fechaNac;
		this.telefono = telefono;
		this.domicilio = domicilio;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public BigInteger getDni() {
		return dni;
	}

	public void setDni(BigInteger dni) {
		this.dni = dni;
	}

	public GregorianCalendar getFechaNacimiento() {
		return fechaNacimiento;
	}

	public void setFechaNacimiento(GregorianCalendar fechaNacimiento) {
		this.fechaNacimiento = fechaNacimiento;
	}

	/**
	 * Calcula la edad del <b>Paciente</b>
	 * 
	 * @return
	 */
	public int getEdad() {
		Calendar dateOfBirth = this.getFechaNacimiento();
		Calendar today = Calendar.getInstance();
		int age = today.get(Calendar.YEAR) - dateOfBirth.get(Calendar.YEAR);
		dateOfBirth.add(Calendar.YEAR, age);
		if (today.before(dateOfBirth))
			age--;
		return age;
	}

	public ObraSocial getObraSocial() {
		return obraSocial;
	}

	public void setObraSocial(ObraSocial obraSocial) {
		this.obraSocial = obraSocial;
	}

	public String getNroCarnet() {
		return nroCarnet;
	}

	public void setNroCarnet(String nroCarnet) {
		this.nroCarnet = nroCarnet;
	}

	public GregorianCalendar getVencimientoCarnet() {
		return vencimientoCarnet;
	}

	public void setVencimientoCarnet(GregorianCalendar vencimientoCarnet) {
		this.vencimientoCarnet = vencimientoCarnet;
	}

	public Boolean getTieneCoseguro() {
		return tieneCoseguro;
	}

	public void setTieneCoseguro(Boolean tieneCoseguro) {
		this.tieneCoseguro = tieneCoseguro;
	}

	public String getTelefono() {
		return telefono;
	}

	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}

	public String getDomicilio() {
		return domicilio;
	}

	public void setDomicilio(String domicilio) {
		this.domicilio = domicilio;
	}

//	public List<Atencion> getAtenciones() {
//		return atenciones;
//	}
//
//	public void setAtenciones(List<Atencion> atenciones) {
//		this.atenciones = atenciones;
//	}

}
